package cn.whit.blog.util;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 * 动态查询工具类，用于拼接SQL、填充PreparedStatement
 *
 */
public class DynamicQuery {
	private String templet = " AND %s %s ?";
	private String baseSql;
	private ArrayList<Parameter> parameters = new ArrayList<Parameter>();
	
	public ArrayList<Parameter> getParameters() {
		return parameters;
	}

	public DynamicQuery() {

	}

	/**
	 * baseSql需要带有where条件
	 * 
	 * @param baseSql
	 */
	public void setBaseSql(String baseSql) {
		this.baseSql = baseSql;
	}

	public void addParameter(Parameter parameter) {
		parameters.add(parameter);
	}

	public String generateSql() {
		StringBuffer sb = new StringBuffer(baseSql);
		for (Parameter parameter : parameters) {
			sb.append(String.format(templet, parameter.getField(), parameter.getOperator()));
		}
		return sb.toString();
	}

	public void fillPreparedStatement(PreparedStatement pst) throws SQLException {
		int count = 1;
		for (Parameter p : parameters) {
			// 这里使用SetObjcet的缺点是失去了类型的验证功能，todo：根据类型，set不同的类型
			pst.setObject(count, p.getValue());
			count++;
		}
	}
}
